home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
fortran
/
libry51.zip
/
LIBRY7A.DOC
< prev
next >
Wrap
Text File
|
1989-11-10
|
5KB
|
267 lines
.de
.pa
EXAMPLE PROGRAM ILLUSTRATING THE USE OF VECTOR INSTRUCTIONS
$STORAGE:2
PROGRAM TEST
C
C this program illustrates how to use the vector instructions
C
IMPLICIT INTEGER*2(I-N),REAL*4(A-H,O-Z)
PARAMETER (N=5)
DIMENSION AS(N,N),BS(N),CS(N),AV(N,N),BV(N),CV(N),JPIVOT(N)
C
C create Vandermonde
C
DO 100 I=1,N
BS(I)=FACT(I-1)
BV(I)=FACT(I-1)
DO 100 J=1,N
AS(I,J)=FLOAT(I)**(J-1)
100 AV(I,J)=FLOAT(I)**(J-1)
C
C scalar solve
C
CALL SCALAR(AS,BS,CS,JPIVOT,N,IER)
C
C vector solve
C
CALL VECTOR(AV,BV,CV,JPIVOT,N,IER)
C
C list solution
C
DO 200 I=1,N
200 WRITE(*,'(1X,I2,1P2E15.5)') I,CS(I),CV(I)
C
STOP
END
SUBROUTINE SCALAR(A,B,X,JPIVOT,N,IER)
C
C GAUSS ELIMINATION WITH FULL PIVOTING (SIMULTANEOUS EQUATIONS)
C SINGLE PRECISION VERSION WITHOUT VECTOR CALLS
C
IMPLICIT INTEGER*2(I-N),REAL*4(A-H,O-Z)
DIMENSION A(N,N),B(N),X(N),JPIVOT(N)
DATA SMALL/1.E-35/
C
C CHECK FOR ERRORS
C
IER=0
IF(N.LT.1) GO TO 900
C
C N=1 SIMULTANEOUS EQUATIONS
C
IF(N.GT.1) GO TO 100
A11=A(1,1)
IF(ABS(A11).LT.SMALL) GO TO 910
X(1)=B(1)/A11
GO TO 999
C
C N>1 SIMULTANEOUS EQUATIONS
C
100 N1=N-1
C
C INITIALIZE THE PIVOT VECTOR
C
DO 110 I=1,N
110 JPIVOT(I)=I
C
C REDUCE THE MATRIX TO UPPER TRIANGULAR FORM
C
DO 160 K=1,N1
K1=K+1
C
C LOCATE THE LARGEST ELEMENT IN THE REDUCED MATRIX
C
IP=K
JP=K
AMAX=ABS(A(IP,JP))
DO 120 I=K,N
DO 120 J=K,N
AIJ=ABS(A(I,J))
IF(AIJ.GT.AMAX) THEN
AMAX=AIJ
IP=I
JP=J
ENDIF
120 CONTINUE
IF(AMAX.LT.SMALL) GO TO 910
C
C SWAP ROWS TO MOVE THE LARGEST ELEMENT INTO THE PIVOT POSITION
C
IF(IP.EQ.K) GO TO 130
BK=B(K)
B(K)=B(IP)
B(IP)=BK
C
DO 121 J=K,N
AKJ=A(K,J)
A(K,J)=A(IP,J)
121 A(IP,J)=AKJ
C
C SWAP COLUMNS TO MOVE THE LARGEST ELEMENT INTO THE PIVOT POSITION
C
130 IF(JP.EQ.K) GO TO 140
J=JPIVOT(JP)
JPIVOT(JP)=JPIVOT(K)
JPIVOT(K)=J
C
DO 131 I=1,N
AIJ=A(I,K)
A(I,K)=A(I,JP)
131 A(I,JP)=AIJ
C
C NORMALIZE THE ROW
C
140 DO 150 I=K1,N
R=A(I,K)/A(K,K)
B(I)=B(I)-R*B(K)
DO 150 J=K1,N
150 A(I,J)=A(I,J)-R*A(K,J)
C
160 CONTINUE
C
C FINAL PIVOT ELEMENT
C
ANN=A(N,N)
IF(ABS(ANN).LT.SMALL) GO TO 910
X(N)=B(N)/ANN
C
C BACKSOLVE THE UPPER TRIANGULAR MATRIX
C
DO 171 IN=2,N
I=N+1-IN
C
BI=0.
DO 170 J=I+1,N
170 BI=BI+A(I,J)*X(J)
C
171 X(I)=(B(I)-BI)/A(I,I)
C
C PIVOT BACK TO THE ORIGINAL ORDER
C
DO 180 I=1,N
180 B(I)=X(I)
C
DO 181 I=1,N
181 X(JPIVOT(I))=B(I)
GO TO 999
C
900 IER=1
GO TO 999
C
910 IER=2
C
999 RETURN
END
SUBROUTINE VECTOR(A,B,X,JPIVOT,N,IER)
C
C GAUSS ELIMINATION WITH FULL PIVOTING (SIMULTANEOUS EQUATIONS)
C SINGLE PRECISION VERSION WITH VECTOR CALLS
C
IMPLICIT INTEGER*2(I-N),REAL*4(A-H,O-Z)
DIMENSION A(N,N),B(N),X(N),JPIVOT(N)
DATA SMALL/1.E-35/
C
C CHECK FOR ERRORS
C
IER=0
IF(N.LT.1) GO TO 900
C
C N=1 SIMULTANEOUS EQUATIONS
C
IF(N.GT.1) GO TO 100
AA=A(1,1)
IF(ABS(AA).LT.SMALL) GO TO 910
X(1)=B(1)/AA
GO TO 999
C
C N>1 SIMULTANEOUS EQUATIONS
C
100 N1=N-1
C
C INITIALIZE THE PIVOT VECTOR
C
DO 110 I=1,N
110 JPIVOT(I)=I
C
C TRANSPOSE MATRIX
C
DO 120 I=1,N1
I1=I+1
120 CALL VSWP(A(I,I1),N,A(I1,I),1,N-I)
C
C REDUCE THE MATRIX TO UPPER TRIANGULAR FORM
C
DO 160 K=1,N1
K1=K+1
C
C LOCATE THE LARGEST ELEMENT IN THE REDUCED MATRIX
C
CALL VMAB(KK,A(1,K),1,(N-K+1)*N)
KK=KK+(K-1)*N
IP=(KK-1)/N+1
JP=KK-(IP-1)*N
C
C SWAP ROWS TO MOVE THE LARGEST ELEMENT INTO THE PIVOT POSITION
C
IF(IP.EQ.K) GO TO 130
BB=B(K)
B(K)=B(IP)
B(IP)=BB
C
CALL VSWP(A(1,IP),1,A(1,K),1,N)
C
C SWAP COLUMNS TO MOVE THE LARGEST ELEMENT INTO THE PIVOT POSITION
C
130 IF(JP.EQ.K) GO TO 140
JJ=JPIVOT(JP)
JPIVOT(JP)=JPIVOT(K)
JPIVOT(K)=JJ
C
CALL VSWP(A(JP,1),N,A(K,1),N,N)
C
C NORMALIZE THE ROW
C
140 DO 150 I=K1,N
R=A(K,I)/A(K,K)
IF(ABS(R).LT.SMALL) GO TO 150
B(I)=B(I)-R*B(K)
CALL VPIV(-R,A(K1,K),1,A(K1,I),1,A(K1,I),1,N-K)
150 A(K,I)=0.
C
160 CONTINUE
C
C FINAL PIVOT ELEMENT
C
AA=A(N,N)
IF(ABS(AA).LT.SMALL) GO TO 910
C
C BACKSOLVE THE UPPER TRIANGULAR MATRIX
C
X(N)=B(N)/AA
C
DO 170 IN=2,N
I=N+1-IN
I1=I+1
CALL VDOT(XI,A(I1,I),1,X(I1),1,N-I)
170 X(I)=(B(I)-XI)/A(I,I)
C
C PIVOT BACK TO THE ORIGINAL ORDER
C
CALL VMOV(X,1,B,1,N)
C
DO 180 I=1,N
180 X(JPIVOT(I))=B(I)
GO TO 999
C
900 IER=1
GO TO 999
C
910 IER=2
C
999 RETURN
END
.ee